'''
队列：先进先出

多个进程如何通过队列实现数据共享？
1.创建一个队列对象
2.将队列对象作为参数传递给进程
3.在进程中使用队列对象

队列的方法：
put()：将元素放入队列
get()：从队列中取出一个元素
qsize()：查看队列的长度
empty()：查看队列是否为空
full()：查看队列是否已满
put_nowait()：将元素放入队列，如果队列已满，会抛出异常
get_nowait()：从队列中取出一个元素，如果队列为空，会抛出异常
close()：关闭队列，不再接受元素
join_thread()：等待所有元素被处理完毕
task_done()：标记一个元素已经被处理完毕


'''

from multiprocessing import Queue
import multiprocessing

def test():
    q = Queue(3)  # 队列的长度为3,如果不指定长度，默认为无限长,当队列满了之后，会阻塞，直到队列有空间
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())  # 从队列中取出一个元素,如果队列为空，会阻塞，直到队列中有元素,取出元素后，队列中的元素会自动删除
    print(q.get())
    print(q.qsize())  # 查看队列的长度
    print(q.empty())  # 查看队列是否为空
    print(q.full())  # 查看队列是否已满
    q.put(4)
    print(q.full())  # 查看队列是否已满



# 生产者函数
def producer(queue):
    for i in range(5):
        print(f"生产者放入数据: {i}")
        queue.put(i)

# 消费者函数
def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(f"消费者取出数据: {item}")

if __name__ == "__main__":
    # 创建一个队列
    q = multiprocessing.Queue()

    # 创建生产者和消费者进程
    p1 = multiprocessing.Process(target=producer, args=(q,))
    p2 = multiprocessing.Process(target=consumer, args=(q,))

    # 启动进程
    p1.start()
    p2.start()

    # 等待生产者进程完成
    p1.join()

    # 向队列中放入一个 None 作为结束信号
    q.put(None)

    # 等待消费者进程完成
    p2.join()

    print("所有任务完成")




# if __name__ == "__main__":
#     test()
#
